package jonggyuni.basic;

public class J12_SungJuk_v4b {

	public static void main(String[] args) {
		//접근 지정자를 이용해서 SungJuk클래스 정의
		J12SungJuk sj = new J12SungJuk();
		//sj.name = "지현"; //private 걸려있어서 사용불가
		
		//name 멤버변수는 접근지정자가 private이므로
		//위 코드처럼 작성하면 오류 발생!

		sj = new J12SungJuk("지현", 80, 80, 70);
		//어쩔수 없이 생성자를 이용해서 name, kor, eng, math 멤버변수를 초기화 함
		
		//System.out.println(sj.name);//사용 불가!!
		//하지만, 기존 방식으로 name 변수를 출력하려해도 private 접근 지정자 때문에 오류 발생!
		
		//따라서, private 으로 선언된 멤버변수를 조작하거나 값을 읽어오려면
		//그것을 위한 특별한 메서드를 작성
		// setter/getter 메서드를 작성함
		sj.setName("수지");
		sj.setKor(90);
		sj.setEng(80);
		sj.setMath(70);
		
		
		//toString() 메서드를 이용해서 
		//객체의 모든 멤버변수 출력하기
		System.out.println("------------------");
		System.out.println(sj.toString());
		System.out.println("------------------");
/*		System.out.println(sj.getName());
		System.out.println(sj.getKor());
		System.out.println(sj.getEng());
		System.out.println(sj.getMath());
		System.out.println(sj.getTot());
		System.out.println(sj.getAvg());
		System.out.println(sj.getGrd());*/
		
	}//main

}//class


class J12SungJuk{//private는 해당 클래스에서만 사용가능
	private String name;
	private int kor;
	private int eng;
	private int math;
	
	private int tot;
	private double avg;
	private char grd;
	
	public J12SungJuk() {}//기본 생성자 생성.
	
	public J12SungJuk(String name, int kor, int eng, int math) {//생성자를 통해서 값을 수정
		this.name=name;
		this.kor=kor;
		this.eng=eng;
		this.math=math;		
	}
	
	//setter 메서드 : 멤버변수에 값을 set하기 위한 메서드
	//public void set멤버변수명( 자료형 멤버변수명 ){
	//       this.멤버변수명 = 멤버변수명
	//}
	
	public void setName(String name){
		this.name = name;
	}
	
	public void setKor(int kor){
		this.kor = kor;
	}
	
	public void setEng(int eng){
		this.eng = eng;
	}
	
	public void setMath(int math){
		this.math = math;
	}
	
//	public void setTot(){
//		this.tot = kor+eng+math;
//	}
//	
//	public void setAvg(){
//		this.avg = tot/3;
//	}
	
//	public void setGrd(){
//		switch((int)avg/10){
//			case 10: case 9: this.grd ='수';
//			break;
//			case 8: this.grd ='우';
//			break;
//			case 7: this.grd ='미';
//			break;
//			case 6: this.grd ='양';
//			break;
//			default : this.grd ='가';				
//		}
//	}	
	
	//getter 메서드 : 멤버변수의 값을 get하기 위한 메서드
	//public 멤버변수자료형 get멤버변수명( ){
	//       return 멤버변수명;
	//}
	
	public String getName(){
		return name;
	}
	
	public int getKor(){
		return kor;
	}
	
	public int getEng(){
		return eng;
	}
	
	public int getMath(){
		return math;
	}
	
	//객체지향 프로그래밍에서는
	//메서드에 너무 많은 책임을 부여하는 것을 금지하고 있음
	//예를 들어, getTot 메서드를 살펴보면
	//단순히 tot변수의 값을 읽어오는 기능 외에 
	//입력한 성적 데이터에대한 총점을 구하는 기능도 포함
	
	
	public int getTot(){
		tot = kor + eng + math;
		return tot;
	}
	
	public double getAvg(){
		avg = tot/3;
		return avg;
	}
	
	public char getGrd(){
		switch((int)avg/10){
		case 10: case 9: grd ='수';
		break;
		case 8: grd ='우';
		break;
		case 7: grd ='미';
		break;
		case 6: grd ='양';
		break;
		default : grd ='가';				
	}		
		return grd;
	}
	
	// 멤버변수의 모든 값을 출력하기 위해
	// Object 클래스에서 기본적으로 제공하는 
	// 메서드인 toString()을 다시 정의 override
	
	@Override //어노테이션 : 컴파일러를 위한 주석
	public String toString() {
		String result ="";
		result = result + " 이름 : "+name+"\n";
		result = result + " 국어 : "+ kor;
		result = result + " 영어 : "+ eng;
		result = result + " 수학 : "+ math;
		
		result = result + " 총점 : "+ getTot();
		result = result + " 평균 : "+ getAvg();
		result = result + " 학점 : "+ getGrd(); //실행 할때마다 재실행됨

		return result;
	}
	
	
}




























